home *** CD-ROM | disk | FTP | other *** search
/ Isometric Game Programming with DirectX 7.0 / Isometric Game Programming.iso / directx / dxf / samples / multimedia / directmusic / audiofx / audiofx.cpp next >
Encoding:
C/C++ Source or Header  |  2000-11-04  |  57.9 KB  |  1,454 lines

  1. //-----------------------------------------------------------------------------
  2. // File: AudioFX.cpp
  3. //
  4. // Desc: Sample to demonstrate soundFX and parameters with DirectMusic
  5. //
  6. //
  7. // Copyright ( c ) 1998-2000 Microsoft Corporation. All rights reserved.
  8. //-----------------------------------------------------------------------------
  9. #define STRICT
  10. #include <windows.h>
  11. #include <basetsd.h>
  12. #include <mmsystem.h>
  13. #include <mmreg.h>
  14. #include <dxerr8.h>
  15. #include <dsound.h>
  16. #include <cguid.h>
  17. #include <commctrl.h>
  18. #include <commdlg.h>
  19. #include <dsound.h>
  20. #include <stdio.h>
  21. #include <tchar.h>
  22.  
  23. #include "DMUtil.h"
  24. #include "DSUtil.h"
  25. #include "DXUtil.h"
  26. #include "resource.h"
  27.  
  28.  
  29.  
  30.  
  31.  
  32. //-----------------------------------------------------------------------------
  33. // Function-prototypes
  34. //-----------------------------------------------------------------------------
  35. INT_PTR CALLBACK MainDlgProc( HWND hDlg, UINT msg,  WPARAM wParam, LPARAM lParam );
  36. VOID    OnInitDialog( HWND hDlg );
  37. VOID    OnOpenSoundFile( HWND hDlg );
  38. HRESULT OnPlaySound( HWND hDlg );
  39. VOID    OnEffectChanged( HWND hDlg );
  40. HRESULT ValidateFile( HWND hDlg, TCHAR* strFileName );
  41. HRESULT CreateAndFillBuffer( HWND hDlg, DWORD dwCreationFlags );
  42. VOID    SetBufferOptions( LONG lFrequency, LONG lPakn, LONG lVolume );
  43. VOID    EnablePlayUI( HWND hDlg, BOOL bEnable );
  44. HRESULT ProcessDirectMusicMessages( HWND hDlg );
  45. VOID    LoadParameterUI ( HWND hDlg, DWORD dwFXType );
  46. VOID    ResetParameterUI ( HWND hDlg );
  47.  
  48.  
  49.  
  50.  
  51. //-----------------------------------------------------------------------------
  52. // Name: enum ESFXType
  53. // Desc: each is a unique identifier mapped to a DirectSoundFX
  54. //-----------------------------------------------------------------------------
  55. enum ESFXType
  56. {
  57.     eSFX_chorus = 0,
  58.     eSFX_compressor,
  59.     eSFX_distortion,
  60.     eSFX_echo,
  61.     eSFX_flanger,
  62.     eSFX_gargle,
  63.     eSFX_parameq,
  64.     eSFX_reverb,
  65.  
  66.     // number of enumerated effects
  67.     eNUM_SFX
  68. };
  69.  
  70.  
  71.  
  72.  
  73. //-----------------------------------------------------------------------------
  74. // Name: class CSoundFXManager
  75. // Desc: Takes care of effects for one DirectSoundBuffer
  76. //-----------------------------------------------------------------------------
  77. class CSoundFXManager
  78. {
  79. public:
  80.     CSoundFXManager();
  81.     ~CSoundFXManager();
  82.  
  83. public: // interface
  84.     HRESULT Initialize ( IDirectMusicAudioPath8 * pAudioPath8, BOOL bLoadDefaultParamValues );
  85.     HRESULT UnInitialize ();
  86.  
  87.     HRESULT SetFXEnable( DWORD esfxType );
  88.     HRESULT ActivateFX();
  89.     HRESULT DisableAllFX();
  90.     HRESULT LoadCurrentFXParameters();
  91.  
  92. public: // members
  93.     LPDIRECTSOUNDFXCHORUS8      m_lpChorus;
  94.     LPDIRECTSOUNDFXCOMPRESSOR8  m_lpCompressor;
  95.     LPDIRECTSOUNDFXDISTORTION8  m_lpDistortion;
  96.     LPDIRECTSOUNDFXECHO8        m_lpEcho;
  97.     LPDIRECTSOUNDFXFLANGER8     m_lpFlanger;
  98.     LPDIRECTSOUNDFXGARGLE8      m_lpGargle;
  99.     LPDIRECTSOUNDFXPARAMEQ8     m_lpParamEq;
  100.     LPDIRECTSOUNDFXWAVESREVERB8 m_lpReverb;
  101.  
  102.     DSFXChorus                  m_paramsChorus;
  103.     DSFXCompressor              m_paramsCompressor;
  104.     DSFXDistortion              m_paramsDistortion;
  105.     DSFXEcho                    m_paramsEcho;
  106.     DSFXFlanger                 m_paramsFlanger;
  107.     DSFXGargle                  m_paramsGargle;
  108.     DSFXParamEq                 m_paramsParamEq;
  109.     DSFXWavesReverb             m_paramsReverb;
  110.  
  111.     LPDIRECTSOUNDBUFFER8        m_lpDSB8;
  112.     IDirectMusicAudioPath8 *    m_pAudioPath;
  113.  
  114. protected:
  115.     DSEFFECTDESC                m_rgFxDesc[eNUM_SFX];
  116.     const GUID *                m_rgRefGuids[eNUM_SFX];
  117.     LPVOID *                    m_rgPtrs[eNUM_SFX];
  118.     BOOL                        m_rgLoaded[eNUM_SFX];
  119.     DWORD                       m_dwNumFX;
  120.  
  121.     HRESULT EnableGenericFX( GUID guidSFXClass, REFGUID rguidInterface, LPVOID * ppObj );
  122.     HRESULT LoadDefaultParamValues();
  123. };
  124.  
  125.  
  126.  
  127.  
  128. //-----------------------------------------------------------------------------
  129. // defines and global variables
  130. //-----------------------------------------------------------------------------
  131. #define             DEFAULT_SLIDER_MIN          1
  132. #define             DEFAULT_SLIDER_MAX          0x7FFFFF
  133. #define             DEFAULT_SLIDER_INC          DEFAULT_SLIDER_MAX >> 11
  134.  
  135. CMusicManager *     g_lpMusicManager        = NULL;
  136. CMusicSegment *     g_pSegment              = NULL;
  137. CSoundFXManager *   g_lpFXManager           = NULL;
  138. HINSTANCE           g_hInst                 = NULL;
  139. TCHAR               g_strFileName[MAX_PATH];
  140. DWORD               g_dwCurrentFXType       = eSFX_chorus;
  141. HANDLE              g_hDMusicMessageEvent   = NULL;
  142.  
  143. const TCHAR *       g_strFXNames[] = { "Chorus", "Compressor", "Distortion", "Echo", 
  144.                                        "Flanger", "Gargle", "Param Eq", "Reverb" };
  145.  
  146.  
  147.  
  148.  
  149. //-----------------------------------------------------------------------------
  150. // Name: WinMain()
  151. // Desc: Entry point for the application.  Since we use a simple dialog for 
  152. //       user interaction we don't need to pump messages.
  153. //-----------------------------------------------------------------------------
  154. INT APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, INT nCmdShow )
  155. {
  156.     HWND    hDlg = NULL;
  157.     BOOL    bDone = FALSE;
  158.     int     nExitCode;
  159.     HRESULT hr; 
  160.     DWORD   dwResult;
  161.     MSG     msg;
  162.  
  163.     g_hInst = hInst;
  164.  
  165.     CoInitialize( NULL );
  166.  
  167.     // Init the common control dll 
  168.     InitCommonControls();
  169.  
  170.     // Display the main dialog box.
  171.     hDlg = CreateDialog( hInst, MAKEINTRESOURCE(IDD_MAIN), NULL, MainDlgProc );
  172.     ShowWindow( hDlg, nCmdShow );
  173.     UpdateWindow( hDlg );
  174.  
  175.     while( !bDone ) 
  176.     { 
  177.         dwResult = MsgWaitForMultipleObjects( 1, &g_hDMusicMessageEvent, 
  178.                                               FALSE, INFINITE, QS_ALLEVENTS );
  179.         switch( dwResult )
  180.         {
  181.             case WAIT_OBJECT_0 + 0:
  182.                 // g_hDPMessageEvent is signaled, so there are
  183.                 // DirectPlay messages available
  184.                 if( FAILED( hr = ProcessDirectMusicMessages( hDlg ) ) ) 
  185.                 {
  186.                     DXTRACE_ERR( TEXT("ProcessDirectMusicMessages"), hr );
  187.                     return FALSE;
  188.                 }
  189.                 break;
  190.  
  191.             case WAIT_OBJECT_0 + 1:
  192.                 // Windows messages are available
  193.                 while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) 
  194.                 { 
  195.                     if( !IsDialogMessage( hDlg, &msg ) )  
  196.                     {
  197.                         TranslateMessage( &msg ); 
  198.                         DispatchMessage( &msg ); 
  199.                     }
  200.  
  201.                     if( msg.message == WM_QUIT )
  202.                     {
  203.                         nExitCode = (int)msg.wParam;
  204.                         bDone     = TRUE;
  205.                         DestroyWindow( hDlg );
  206.                     }
  207.                 }
  208.                 break;
  209.         }
  210.     }
  211.  
  212.     CoUninitialize();
  213.  
  214.     return nExitCode;
  215. }
  216.  
  217.  
  218.  
  219.  
  220. //-----------------------------------------------------------------------------
  221. // Name: MainDlgProc()
  222. // Desc: Handles dialog messages
  223. //-----------------------------------------------------------------------------
  224. INT_PTR CALLBACK MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
  225. {
  226.     HRESULT hr;
  227.  
  228.     switch( msg ) 
  229.     {
  230.         case WM_COMMAND:
  231.             switch( LOWORD(wParam) )
  232.             {
  233.                 case IDOK:
  234.                 case IDCANCEL:
  235.                     PostQuitMessage( 0 );
  236.                     break;
  237.  
  238.                 case IDC_BUTTON_OPEN:
  239.                     OnOpenSoundFile( hDlg );
  240.                     break;
  241.  
  242.                 case IDC_BUTTON_PLAY:
  243.                     if( FAILED( hr = OnPlaySound( hDlg ) ) )
  244.                     {
  245.                         DXTRACE_ERR( TEXT("OnPlaySound"), hr );
  246.                         MessageBox( hDlg, "Error playing DirectSound buffer."
  247.                                     "Sample will now exit.", "DirectSound Sample", 
  248.                                     MB_OK | MB_ICONERROR );
  249.                         EndDialog( hDlg, IDABORT );
  250.                     }
  251.                     break;
  252.  
  253.                 case IDC_BUTTON_STOP:
  254.                     if( g_pSegment )
  255.                         g_pSegment->Stop();
  256.                     EnablePlayUI( hDlg, TRUE );
  257.                     SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Sound stopped.") );
  258.                     break;
  259.  
  260.                 case IDC_RADIO_TRIANGLE:
  261.                 case IDC_RADIO_SQUARE:
  262.                 case IDC_RADIO_SINE:
  263.                 case IDC_RADIO_NEG_180:
  264.                 case IDC_RADIO_NEG_90:
  265.                 case IDC_RADIO_ZERO:
  266.                 case IDC_RADIO_90:
  267.                 case IDC_RADIO_180:
  268.                     OnEffectChanged( hDlg );
  269.                     break;
  270.  
  271.                 default:
  272.                     if( LOWORD( wParam ) >= IDC_RADIO_CHORUS &&
  273.                         LOWORD( wParam ) <= IDC_RADIO_REVERB )
  274.                     {
  275.                         g_dwCurrentFXType = LOWORD( wParam ) - IDC_RADIO_CHORUS;
  276.                         LoadParameterUI( hDlg, g_dwCurrentFXType );
  277.                     }
  278.                     else
  279.                         return FALSE; // Didn't handle message
  280.             }
  281.             break;
  282.  
  283.         case WM_INITDIALOG:
  284.             OnInitDialog( hDlg );
  285.             break;
  286.  
  287.         case WM_NOTIFY:
  288.         {
  289.             //LPNMHDR pnmh = ( LPNMHDR ) lParam;
  290.             //if( pnmh->code >= IDC_SLIDER1 && pnmh->code <= IDC_SLIDER6 )
  291.             //{
  292.                 OnEffectChanged( hDlg );
  293.             //}
  294.             break;
  295.         }
  296.         case WM_DESTROY:
  297.             // Cleanup everything
  298.             SAFE_DELETE( g_lpFXManager );
  299.             SAFE_DELETE( g_pSegment );
  300.             SAFE_DELETE( g_lpMusicManager );
  301.             break; 
  302.  
  303.         default:
  304.             return FALSE; // Didn't handle message
  305.     }
  306.  
  307.     return TRUE; // Handled message
  308. }
  309.  
  310.  
  311.  
  312.  
  313. //-----------------------------------------------------------------------------
  314. // Name: OnInitDialog()
  315. // Desc: Initializes the dialogs (sets up UI controls, etc.)
  316. //-----------------------------------------------------------------------------
  317. VOID OnInitDialog( HWND hDlg )
  318. {
  319.     HRESULT hr;
  320.  
  321.     HICON hIcon = LoadIcon( g_hInst, MAKEINTRESOURCE( IDI_ICON ) );
  322.     SendMessage( hDlg, WM_SETICON, ICON_BIG, ( LPARAM ) hIcon );
  323.     SendMessage( hDlg, WM_SETICON, ICON_SMALL, ( LPARAM ) hIcon );
  324.     
  325.     // create a DirectMusicManager
  326.     g_lpMusicManager = new CMusicManager();
  327.     g_lpFXManager = new CSoundFXManager();
  328.  
  329.     // create a music manager with 128 performance channels, stereo (not shared)
  330.     if( FAILED( hr = g_lpMusicManager->Initialize( hDlg, 128, DMUS_APATH_DYNAMIC_STEREO ) ) )
  331.     {
  332.         DXTRACE_ERR( TEXT("Initialize"), hr );
  333.         MessageBox( hDlg, "Error initializing DirectSound.  Sample will now exit.", 
  334.                     "DirectSound Sample", MB_OK | MB_ICONERROR );
  335.         PostQuitMessage( 0 );
  336.         return;
  337.     }
  338.  
  339.     // Register segment notification, to know when segment stopped
  340.     g_hDMusicMessageEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
  341.     GUID guid = GUID_NOTIFICATION_SEGMENT;
  342.  
  343.     IDirectMusicPerformance * pPerf = g_lpMusicManager->GetPerformance();
  344.     pPerf->AddNotificationType( guid );
  345.     pPerf->SetNotificationHandle( g_hDMusicMessageEvent, 0 );  
  346.  
  347.     // Load default file
  348.     TCHAR strFile[MAX_PATH];
  349.     GetWindowsDirectory( strFile, MAX_PATH );
  350.     lstrcat( strFile, "\\media\\ding.wav" );
  351.     
  352.     if( FAILED( hr = ValidateFile( hDlg, strFile ) ) )
  353.     {
  354.         // Set the UI controls
  355.         SetDlgItemText( hDlg, IDC_TEXT_FILENAME, TEXT("") );
  356.         SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("No file loaded.") );
  357.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY ), FALSE );
  358.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP ), FALSE );
  359.         return;
  360.     }
  361.  
  362.     if( SUCCEEDED( hr = g_lpMusicManager->CreateSegmentFromFile( &g_pSegment, g_strFileName, TRUE, FALSE ) ) )
  363.     {
  364.         g_lpFXManager->Initialize( g_lpMusicManager->GetDefaultAudioPath(), TRUE );
  365.  
  366.         // reset the manager so nothing is enabled - the parameters retained, however
  367.         g_lpFXManager->UnInitialize();
  368.  
  369.         SAFE_DELETE( g_pSegment );
  370.     }
  371.  
  372.     // set UI defaults
  373.     CheckDlgButton( hDlg, IDC_CHECK_LOOP, BST_CHECKED );
  374.     CheckRadioButton( hDlg, IDC_RADIO_CHORUS, IDC_RADIO_REVERB, IDC_RADIO_CHORUS );
  375.     LoadParameterUI( hDlg, g_dwCurrentFXType );
  376.     EnablePlayUI( hDlg, TRUE );
  377. }
  378.  
  379.  
  380.  
  381.  
  382. //-----------------------------------------------------------------------------
  383. // Name: OnPlaySound()
  384. // Desc: User hit the "Play" button
  385. //-----------------------------------------------------------------------------
  386. HRESULT OnPlaySound( HWND hDlg )
  387. {
  388.     HRESULT hr;
  389.     DWORD   i;
  390.  
  391.     BOOL bLooped = ( IsDlgButtonChecked( hDlg, IDC_CHECK_LOOP ) == BST_CHECKED );
  392.  
  393.     // Free any previous sound and FXs
  394.     g_lpFXManager->DisableAllFX();
  395.  
  396.     SAFE_DELETE( g_pSegment );
  397.     g_lpMusicManager->CollectGarbage();
  398.  
  399.     // For DirectMusic must know if the file is a standard MIDI file or not
  400.     // in order to load the correct instruments.
  401.     BOOL bMidiFile = FALSE;
  402.     if( strstr( g_strFileName, ".mid" ) != NULL ||
  403.         strstr( g_strFileName, ".rmi" ) != NULL ) 
  404.     {
  405.         bMidiFile = TRUE;
  406.     }
  407.  
  408.     // Since the user can change the focus before the sound is played, 
  409.     // we need to create the sound buffer every time the play button is pressed 
  410.     // Load the segment file into a DirectMusicSegment buffer
  411.     if( FAILED( hr = g_lpMusicManager->CreateSegmentFromFile( &g_pSegment, g_strFileName, 
  412.                                                               TRUE, bMidiFile ) ) )
  413.     {
  414.         // Not a critical failure, so just update the status
  415.         DXTRACE_ERR_NOMSGBOX( TEXT("Create"), hr );
  416.         SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Could not load the segment file.") );
  417.         return S_FALSE; 
  418.     }
  419.  
  420.     g_lpFXManager->Initialize( g_lpMusicManager->GetDefaultAudioPath(), FALSE );
  421.     for( i = IDC_CHECK_CHORUS; i <= IDC_CHECK_REVERB; i++ )
  422.     {
  423.         if( IsDlgButtonChecked( hDlg, i ) == BST_CHECKED )
  424.             g_lpFXManager->SetFXEnable( i - IDC_CHECK_CHORUS );
  425.     }
  426.     g_lpFXManager->ActivateFX();
  427.     g_lpFXManager->LoadCurrentFXParameters();
  428.  
  429.     // Play the sound
  430.     if( FAILED( hr = g_pSegment->SetRepeats( ( bLooped ?  DMUS_SEG_REPEAT_INFINITE : 0 ) ) ) )
  431.         return DXTRACE_ERR( TEXT("SetRepeats"), hr );
  432.     if( FAILED( hr = g_pSegment->Play( 0 ) ) )
  433.         return DXTRACE_ERR( TEXT("Play"), hr );
  434.  
  435.     // Update the UI controls to show the sound as playing
  436.     EnablePlayUI( hDlg, FALSE );
  437.     SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Sound playing.") );
  438.  
  439.     return S_OK;
  440. }
  441.  
  442.  
  443.  
  444.  
  445. //-----------------------------------------------------------------------------
  446. // Name: OnOpenSoundFile()
  447. // Desc: Called when the user requests to open a sound file
  448. //-----------------------------------------------------------------------------
  449. VOID OnOpenSoundFile( HWND hDlg ) 
  450. {
  451.     static TCHAR strFileName[MAX_PATH] = TEXT("");
  452.     static TCHAR strPath[MAX_PATH] = TEXT("");
  453.  
  454.     // Setup the OPENFILENAME structure
  455.     OPENFILENAME ofn = { sizeof(OPENFILENAME), hDlg, NULL,
  456.                          TEXT("Audio Files\0*.sgt;*.mid;*.rmi;*.wav\0All Files\0*.*\0\0"), NULL,
  457.                          0, 1, strFileName, MAX_PATH, NULL, 0, strPath,
  458.                          TEXT("Open Audio File"),
  459.                          OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, 0, 0,
  460.                          TEXT(".wav"), 0, NULL, NULL };
  461.  
  462.     // Get the default media path (something like C:\WINDOWS\MEDIA)
  463.     if( '\0' == strPath[0] )
  464.     {
  465.         GetWindowsDirectory( strPath, MAX_PATH );
  466.         if( strcmp( &strPath[strlen(strPath)], TEXT("\\") ) )
  467.             strcat( strPath, TEXT("\\") );
  468.         strcat( strPath, TEXT("MEDIA") );
  469.     }
  470.  
  471.     // Update the UI controls to show the sound as loading a file
  472.     EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY ), FALSE );
  473.     EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP ), FALSE );
  474.     SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Loading file...") );
  475.  
  476.     if( g_pSegment )
  477.         g_pSegment->Stop();
  478.  
  479.     // Display the OpenFileName dialog. Then, try to load the specified file
  480.     if( TRUE != GetOpenFileName( &ofn ) )
  481.     {
  482.         if( g_pSegment )
  483.         {
  484.             EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY ), TRUE );
  485.             EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP ), TRUE );
  486.         }
  487.  
  488.         SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("Load aborted.") );
  489.         return;
  490.     }
  491.  
  492.     SetDlgItemText( hDlg, IDC_TEXT_FILENAME, TEXT("") );
  493.  
  494.     // Make sure file is a valid file
  495.     ValidateFile( hDlg, strFileName );
  496.  
  497.     EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY ), TRUE );
  498.     EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP ), FALSE );
  499.  
  500.     // Remember the path for next time
  501.     strcpy( strPath, strFileName );
  502.     char* strLastSlash = strrchr( strPath, '\\' );
  503.     strLastSlash[0] = '\0';
  504. }
  505.  
  506.  
  507.  
  508.  
  509. //-----------------------------------------------------------------------------
  510. // Name: EnablePlayUI()
  511. // Desc: Enables or disables the Play UI controls 
  512. //-----------------------------------------------------------------------------
  513. VOID EnablePlayUI( HWND hDlg, BOOL bEnable )
  514. {
  515.     if( bEnable )
  516.     {
  517.         EnableWindow( GetDlgItem( hDlg, IDC_CHECK_LOOP      ), TRUE );
  518.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY     ), TRUE );
  519.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP     ), FALSE );
  520.         SetFocus(     GetDlgItem( hDlg, IDC_BUTTON_PLAY )   );
  521.     }
  522.     else
  523.     {
  524.         EnableWindow( GetDlgItem( hDlg, IDC_CHECK_LOOP      ), FALSE );
  525.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_PLAY     ), FALSE );
  526.         EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_STOP     ), TRUE );
  527.         SetFocus(     GetDlgItem( hDlg, IDC_BUTTON_STOP )   );
  528.     }
  529.  
  530.     for( DWORD i = IDC_CHECK_CHORUS; i <= IDC_CHECK_REVERB; i++ )
  531.         EnableWindow( GetDlgItem( hDlg, i ), bEnable );
  532. }
  533.  
  534.  
  535.  
  536.  
  537. //-----------------------------------------------------------------------------
  538. // Name: ResetParameterUI()
  539. // Desc: Blanks the paramter UI
  540. //-----------------------------------------------------------------------------
  541. VOID ResetParameterUI( HWND hwndDlg )
  542. {
  543.     HWND hwndItem;
  544.     DWORD i;
  545.  
  546.     for ( i = IDC_PARAM_NAME1; i <= IDC_PARAM_MAX6; i++ )
  547.     {
  548.         hwndItem = GetDlgItem( hwndDlg, i );
  549.         SendMessage( hwndItem, WM_SETTEXT, 0, ( LPARAM ) TEXT( "- - -" ) );
  550.         EnableWindow( hwndItem, FALSE );
  551.     }
  552.  
  553.     for ( i = IDC_SLIDER1; i <= IDC_SLIDER6; i += 5 )
  554.     {
  555.         PostMessage( GetDlgItem( hwndDlg, i ), TBM_SETRANGEMIN, FALSE, DEFAULT_SLIDER_MIN );
  556.         PostMessage( GetDlgItem( hwndDlg, i ), TBM_SETRANGEMAX, FALSE, DEFAULT_SLIDER_MAX );
  557.         PostMessage( GetDlgItem( hwndDlg, i ), TBM_SETLINESIZE, FALSE, DEFAULT_SLIDER_INC );
  558.         PostMessage( GetDlgItem( hwndDlg, i ), TBM_SETPOS, TRUE, 0 );
  559.     }
  560.  
  561.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_TRIANGLE ), FALSE );
  562.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_SQUARE ), FALSE );
  563.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_SINE ), FALSE );
  564.     EnableWindow( GetDlgItem( hwndDlg, IDC_FRAME_WAVEFORM ), FALSE );
  565.  
  566.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_NEG_180 ), FALSE );
  567.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_NEG_90 ), FALSE );
  568.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_ZERO ), FALSE );
  569.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_90 ), FALSE );
  570.     EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_180 ), FALSE );
  571.     EnableWindow( GetDlgItem( hwndDlg, IDC_FRAME_PHASE ), FALSE );
  572. }
  573.  
  574.  
  575.  
  576.  
  577. //-----------------------------------------------------------------------------
  578. // Name: EnableSingleParameter
  579. // Desc: 
  580. //-----------------------------------------------------------------------------
  581. VOID EnableSingleParameter( HWND hwndDlg, DWORD resID )
  582. {
  583.     for ( DWORD i = resID; i < resID + 5; i++ )
  584.         EnableWindow( GetDlgItem( hwndDlg, i ), TRUE );      
  585. }
  586.  
  587.  
  588.  
  589.  
  590. //-----------------------------------------------------------------------------
  591. // Name: PosSlider
  592. // Desc: 
  593. //-----------------------------------------------------------------------------
  594. VOID PosSlider( HWND hwndDlg, DWORD dwSlider, FLOAT val, FLOAT min, FLOAT max, 
  595.                 FLOAT fSliderInc )
  596. {
  597.     HWND hwndSlider = GetDlgItem( hwndDlg, dwSlider );
  598.  
  599.     LONG lSliderInc = (LONG) ( (fSliderInc / (max - min)) * DEFAULT_SLIDER_MAX );
  600.     PostMessage( hwndSlider, TBM_SETLINESIZE, FALSE, lSliderInc );
  601.  
  602.     FLOAT res = ( val - min ) / ( max - min );
  603.     if( res < 0.0f )
  604.         res = 0.0f;
  605.     else if( res > 1.0f )
  606.         res = 1.0f;
  607.  
  608.     LONG pos = (LONG) ( res * DEFAULT_SLIDER_MAX );
  609.     PostMessage( hwndSlider, TBM_SETPOS, TRUE, pos );
  610. }
  611.  
  612.  
  613.  
  614.  
  615. //-----------------------------------------------------------------------------
  616. // Name: LoadSingleParameter
  617. // Desc: 
  618. //-----------------------------------------------------------------------------
  619. VOID LoadSingleParameter( HWND hwndDlg, DWORD id, const TCHAR * strName, FLOAT val, 
  620.                           FLOAT min, FLOAT max, FLOAT fSliderInc = 0.1f,
  621.                           DWORD dwPrecision = 1 )
  622. {
  623.     TCHAR strTemp[MAX_PATH];
  624.  
  625.     // wet dry mix
  626.     EnableSingleParameter( hwndDlg, id );
  627.     SendMessage( GetDlgItem( hwndDlg, id ), WM_SETTEXT, 0, ( LPARAM ) strName );
  628.  
  629.     switch( dwPrecision )
  630.     {
  631.         case 0:
  632.             sprintf( strTemp, "%.0f", val );
  633.             SendMessage( GetDlgItem( hwndDlg, id + 1 ), WM_SETTEXT, 0, ( LPARAM ) strTemp );
  634.             sprintf( strTemp, "%.0f", min );
  635.             SendMessage( GetDlgItem( hwndDlg, id + 3 ), WM_SETTEXT, 0, ( LPARAM ) strTemp );
  636.             sprintf( strTemp, "%.0f", max );
  637.             SendMessage( GetDlgItem( hwndDlg, id + 4 ), WM_SETTEXT, 0, ( LPARAM ) strTemp );
  638.             break;
  639.         case 1:
  640.             sprintf( strTemp, "%.1f", val );
  641.             SendMessage( GetDlgItem( hwndDlg, id + 1 ), WM_SETTEXT, 0, ( LPARAM ) strTemp );
  642.             sprintf( strTemp, "%.1f", min );
  643.             SendMessage( GetDlgItem( hwndDlg, id + 3 ), WM_SETTEXT, 0, ( LPARAM ) strTemp );
  644.             sprintf( strTemp, "%.1f", max );
  645.             SendMessage( GetDlgItem( hwndDlg, id + 4 ), WM_SETTEXT, 0, ( LPARAM ) strTemp );
  646.             break;
  647.         default:
  648.         case 2:
  649.             sprintf( strTemp, "%.2f", val );
  650.             SendMessage( GetDlgItem( hwndDlg, id + 1 ), WM_SETTEXT, 0, ( LPARAM ) strTemp );
  651.             sprintf( strTemp, "%.2f", min );
  652.             SendMessage( GetDlgItem( hwndDlg, id + 3 ), WM_SETTEXT, 0, ( LPARAM ) strTemp );
  653.             sprintf( strTemp, "%.2f", max );
  654.             SendMessage( GetDlgItem( hwndDlg, id + 4 ), WM_SETTEXT, 0, ( LPARAM ) strTemp );
  655.             break;
  656.     }
  657.  
  658.     PosSlider( hwndDlg, id + 2, val, min, max, fSliderInc );
  659. }
  660.  
  661.  
  662.  
  663.  
  664. //-----------------------------------------------------------------------------
  665. // Name: SaveSingleParameter
  666. // Desc: 
  667. //-----------------------------------------------------------------------------
  668. VOID SaveSingleParameter( HWND hwndDlg, DWORD id, FLOAT * fVal, FLOAT fMin, FLOAT fMax, DWORD dwPrecision = 1 )
  669. {
  670.     TCHAR strTemp[MAX_PATH];
  671.  
  672.     DWORD dwPos = ( DWORD ) SendMessage( GetDlgItem( hwndDlg, id + 2), TBM_GETPOS, 0, 0 );
  673.  
  674.     FLOAT fPercent = (FLOAT) ( dwPos - DEFAULT_SLIDER_MIN ) / 
  675.                      (FLOAT) ( DEFAULT_SLIDER_MAX - DEFAULT_SLIDER_MIN );
  676.     *fVal = fPercent * ( fMax - fMin ) + fMin;
  677.  
  678.     switch( dwPrecision )
  679.     {
  680.         case 0:
  681.             sprintf( strTemp, "%.0f", *fVal );
  682.             break;
  683.         case 1:
  684.             sprintf( strTemp, "%.1f", *fVal );
  685.             break;
  686.         case 2:
  687.         default:
  688.             sprintf( strTemp, "%.2f", *fVal );
  689.             break;
  690.     }
  691.  
  692.     SendMessage( GetDlgItem( hwndDlg, id + 1 ), WM_SETTEXT, 0, ( LPARAM ) strTemp );
  693. }
  694.  
  695.  
  696.  
  697.  
  698. //-----------------------------------------------------------------------------
  699. // Name: LoadWaveformRadio
  700. // Desc: 
  701. //-----------------------------------------------------------------------------
  702. VOID LoadWaveformRadio( HWND hwndDlg, LONG waveform, LONG triangle, LONG square, LONG sine )
  703. {
  704.     if( waveform == triangle )
  705.         CheckRadioButton( hwndDlg, IDC_RADIO_TRIANGLE, IDC_RADIO_SINE, IDC_RADIO_TRIANGLE );
  706.     else if( waveform == square )
  707.         CheckRadioButton( hwndDlg, IDC_RADIO_TRIANGLE, IDC_RADIO_SINE, IDC_RADIO_SQUARE );
  708.     else if( waveform == sine )
  709.         CheckRadioButton( hwndDlg, IDC_RADIO_TRIANGLE, IDC_RADIO_SINE, IDC_RADIO_SINE );
  710.  
  711.     if( triangle >= 0 )
  712.         EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_TRIANGLE ), TRUE );
  713.     if( square >= 0 )
  714.         EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_SQUARE ), TRUE );
  715.     if( sine >= 0 )
  716.         EnableWindow( GetDlgItem( hwndDlg, IDC_RADIO_SINE ), TRUE );
  717.  
  718.     EnableWindow( GetDlgItem( hwndDlg, IDC_FRAME_WAVEFORM ), ( triangle + square + sine != -3 ) );
  719. }
  720.  
  721.  
  722.  
  723.  
  724. //-----------------------------------------------------------------------------
  725. // Name: LoadPhaseRadio
  726. // Desc: 
  727. //-----------------------------------------------------------------------------
  728. VOID LoadPhaseRadio( HWND hwndDlg, LONG phase, LONG neg180, LONG neg90, LONG zero, LONG pos90, LONG pos180 )
  729. {
  730.     for( int i = IDC_RADIO_NEG_180; i <= IDC_RADIO_180; i++ )
  731.         EnableWindow( GetDlgItem( hwndDlg, i ), TRUE );
  732.  
  733.     EnableWindow( GetDlgItem( hwndDlg, IDC_FRAME_PHASE), TRUE );
  734.  
  735.     if( phase == neg180 )
  736.         CheckRadioButton( hwndDlg, IDC_RADIO_NEG_180, IDC_RADIO_90, IDC_RADIO_NEG_180 );
  737.     else if( phase == neg90 )
  738.         CheckRadioButton( hwndDlg, IDC_RADIO_NEG_180, IDC_RADIO_90, IDC_RADIO_NEG_90 );
  739.     else if( phase == zero )
  740.         CheckRadioButton( hwndDlg, IDC_RADIO_NEG_180, IDC_RADIO_90, IDC_RADIO_ZERO );
  741.     else if( phase == pos90 )
  742.         CheckRadioButton( hwndDlg, IDC_RADIO_NEG_180, IDC_RADIO_90, IDC_RADIO_90 );
  743.     else if( phase == pos180 )
  744.         CheckRadioButton( hwndDlg, IDC_RADIO_NEG_180, IDC_RADIO_90, IDC_RADIO_180 );
  745. }
  746.  
  747.  
  748.  
  749.  
  750. //-----------------------------------------------------------------------------
  751. // Name: LoadParameterUI()
  752. // Desc: loads the paramter ui for particular effect
  753. //-----------------------------------------------------------------------------
  754. VOID LoadParameterUI( HWND hwndDlg, DWORD dwFXType )
  755. {
  756.     TCHAR strTemp[MAX_PATH];
  757.  
  758.     // reset the parameter ui
  759.     ResetParameterUI( hwndDlg );
  760.  
  761.     sprintf( strTemp, "Parameters for [ %s ]", g_strFXNames[dwFXType] );
  762.     SetDlgItemText( hwndDlg, IDC_FRAME, strTemp );
  763.  
  764.     switch( dwFXType)
  765.     {
  766.         case eSFX_chorus:
  767.         {            
  768.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Wet/Dry Mix (%)" ), g_lpFXManager->m_paramsChorus.fWetDryMix, DSFXCHORUS_WETDRYMIX_MIN, DSFXCHORUS_WETDRYMIX_MAX );
  769.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Depth (%)" ), g_lpFXManager->m_paramsChorus.fDepth, DSFXCHORUS_DEPTH_MIN, DSFXCHORUS_DEPTH_MAX );
  770.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "Feedback (%)" ), g_lpFXManager->m_paramsChorus.fFeedback, DSFXCHORUS_FEEDBACK_MIN, DSFXCHORUS_FEEDBACK_MAX );
  771.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME4, TEXT( "Frequency (Hz)" ), g_lpFXManager->m_paramsChorus.fFrequency, DSFXCHORUS_FREQUENCY_MIN, DSFXCHORUS_FREQUENCY_MAX );
  772.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME5, TEXT( "Delay (ms)" ), g_lpFXManager->m_paramsChorus.fDelay, DSFXCHORUS_DELAY_MIN, DSFXCHORUS_DELAY_MAX );
  773.             LoadWaveformRadio( hwndDlg, g_lpFXManager->m_paramsChorus.lWaveform, DSFXCHORUS_WAVE_TRIANGLE, -1, DSFXCHORUS_WAVE_SIN );
  774.             LoadPhaseRadio( hwndDlg, g_lpFXManager->m_paramsChorus.lPhase, DSFXCHORUS_PHASE_NEG_180, DSFXCHORUS_PHASE_NEG_90, DSFXCHORUS_PHASE_ZERO, DSFXCHORUS_PHASE_90, DSFXCHORUS_PHASE_180 );
  775.             break;
  776.         }
  777.  
  778.         case eSFX_compressor:
  779.         {            
  780.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Gain (dB)" ), g_lpFXManager->m_paramsCompressor.fGain, DSFXCOMPRESSOR_GAIN_MIN, DSFXCOMPRESSOR_GAIN_MAX );
  781.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Attack (ms)" ), g_lpFXManager->m_paramsCompressor.fAttack, DSFXCOMPRESSOR_ATTACK_MIN, DSFXCOMPRESSOR_ATTACK_MAX );
  782.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "Release (ms)" ), g_lpFXManager->m_paramsCompressor.fRelease, DSFXCOMPRESSOR_RELEASE_MIN, DSFXCOMPRESSOR_RELEASE_MAX );
  783.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME4, TEXT( "Threshold (dB)" ), g_lpFXManager->m_paramsCompressor.fThreshold, DSFXCOMPRESSOR_THRESHOLD_MIN, DSFXCOMPRESSOR_THRESHOLD_MAX );
  784.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME5, TEXT( "Ratio (x:1)" ), g_lpFXManager->m_paramsCompressor.fRatio, DSFXCOMPRESSOR_RATIO_MIN, DSFXCOMPRESSOR_RATIO_MAX );
  785.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME6, TEXT( "Predelay (ms)" ), g_lpFXManager->m_paramsCompressor.fPredelay, DSFXCOMPRESSOR_PREDELAY_MIN, DSFXCOMPRESSOR_PREDELAY_MAX, 0.05f, 2 );
  786.             break;
  787.         }
  788.  
  789.         case eSFX_distortion:
  790.         {            
  791.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Gain (dB)" ), g_lpFXManager->m_paramsDistortion.fGain, DSFXDISTORTION_GAIN_MIN, DSFXDISTORTION_GAIN_MAX );
  792.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Edge (%)" ), g_lpFXManager->m_paramsDistortion.fEdge, DSFXDISTORTION_EDGE_MIN, DSFXDISTORTION_EDGE_MAX );
  793.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "PostEQ Center Freq (Hz)" ), g_lpFXManager->m_paramsDistortion.fPostEQCenterFrequency, DSFXDISTORTION_POSTEQCENTERFREQUENCY_MIN, DSFXDISTORTION_POSTEQCENTERFREQUENCY_MAX, 1.0f, 0 );
  794.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME4, TEXT( "PostEQ Bandwidth (Hz)" ), g_lpFXManager->m_paramsDistortion.fPostEQBandwidth, DSFXDISTORTION_POSTEQBANDWIDTH_MIN, DSFXDISTORTION_POSTEQBANDWIDTH_MAX, 1.0f, 0 );
  795.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME5, TEXT( "PreLowpass Cutoff (Hz)" ), g_lpFXManager->m_paramsDistortion.fPreLowpassCutoff, DSFXDISTORTION_PRELOWPASSCUTOFF_MIN, DSFXDISTORTION_PRELOWPASSCUTOFF_MAX, 1.0f, 0 );
  796.             break;
  797.         }
  798.  
  799.         case eSFX_echo:
  800.         {            
  801.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Wet/Dry Mix (%)" ), g_lpFXManager->m_paramsEcho.fWetDryMix, DSFXECHO_WETDRYMIX_MIN, DSFXECHO_WETDRYMIX_MAX );
  802.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Feedback (%)" ), g_lpFXManager->m_paramsEcho.fFeedback, DSFXECHO_FEEDBACK_MIN, DSFXECHO_FEEDBACK_MAX );
  803.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "Left Delay (ms)" ), g_lpFXManager->m_paramsEcho.fLeftDelay, DSFXECHO_LEFTDELAY_MIN, DSFXECHO_LEFTDELAY_MAX );
  804.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME4, TEXT( "Right Delay (ms)" ), g_lpFXManager->m_paramsEcho.fRightDelay, DSFXECHO_RIGHTDELAY_MIN, DSFXECHO_RIGHTDELAY_MAX );
  805.             break;
  806.         }
  807.  
  808.         case eSFX_flanger:
  809.         {            
  810.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Wet/Dry Mix (%)" ), g_lpFXManager->m_paramsFlanger.fWetDryMix, DSFXFLANGER_WETDRYMIX_MIN, DSFXFLANGER_WETDRYMIX_MAX );
  811.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Depth (%)" ), g_lpFXManager->m_paramsFlanger.fDepth, DSFXFLANGER_DEPTH_MIN, DSFXFLANGER_DEPTH_MAX );
  812.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "Feedback (%)" ), g_lpFXManager->m_paramsFlanger.fFeedback, DSFXFLANGER_FEEDBACK_MIN, DSFXFLANGER_FEEDBACK_MAX );
  813.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME4, TEXT( "Frequency (Hz)" ), g_lpFXManager->m_paramsFlanger.fFrequency, DSFXFLANGER_FREQUENCY_MIN, DSFXFLANGER_FREQUENCY_MAX, 0.01f, 2 );
  814.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME5, TEXT( "Delay (ms)" ), g_lpFXManager->m_paramsFlanger.fDelay, DSFXFLANGER_DELAY_MIN, DSFXFLANGER_DELAY_MAX, 0.01f, 2 );
  815.             LoadWaveformRadio( hwndDlg, g_lpFXManager->m_paramsFlanger.lWaveform, DSFXFLANGER_WAVE_TRIANGLE, -1, DSFXFLANGER_WAVE_SIN );
  816.             LoadPhaseRadio( hwndDlg, g_lpFXManager->m_paramsFlanger.lPhase, DSFXFLANGER_PHASE_NEG_180, DSFXFLANGER_PHASE_NEG_90, DSFXFLANGER_PHASE_ZERO, DSFXFLANGER_PHASE_90, DSFXFLANGER_PHASE_180 );
  817.             break;
  818.         }
  819.  
  820.         case eSFX_gargle:
  821.         {            
  822.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Rate (Hz)" ), ( FLOAT ) g_lpFXManager->m_paramsGargle.dwRateHz, ( FLOAT ) DSFXGARGLE_RATEHZ_MIN, ( FLOAT ) DSFXGARGLE_RATEHZ_MAX );
  823.             LoadWaveformRadio( hwndDlg, g_lpFXManager->m_paramsGargle.dwWaveShape, DSFXGARGLE_WAVE_TRIANGLE, DSFXGARGLE_WAVE_SQUARE, -1 );
  824.             break;
  825.         }
  826.  
  827.         case eSFX_parameq:
  828.         {            
  829.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "Center Freq (Hz)" ), g_lpFXManager->m_paramsParamEq.fCenter, DSFXPARAMEQ_CENTER_MIN, DSFXPARAMEQ_CENTER_MAX );
  830.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Bandwidth (Hz)" ), g_lpFXManager->m_paramsParamEq.fBandwidth, DSFXPARAMEQ_BANDWIDTH_MIN, DSFXPARAMEQ_BANDWIDTH_MAX );
  831.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "Gain (dB)" ), g_lpFXManager->m_paramsParamEq.fGain, DSFXPARAMEQ_GAIN_MIN, DSFXPARAMEQ_GAIN_MAX );
  832.             break;
  833.         }
  834.  
  835.         case eSFX_reverb:
  836.         {            
  837.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME1, TEXT( "In Gain (dB)" ), g_lpFXManager->m_paramsReverb.fInGain, DSFX_WAVESREVERB_INGAIN_MIN, DSFX_WAVESREVERB_INGAIN_MAX );
  838.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME2, TEXT( "Reverb Mix (dB)" ), g_lpFXManager->m_paramsReverb.fReverbMix, DSFX_WAVESREVERB_REVERBMIX_MIN, DSFX_WAVESREVERB_REVERBMIX_MAX );
  839.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME3, TEXT( "Reverb Time (ms)" ), g_lpFXManager->m_paramsReverb.fReverbTime, DSFX_WAVESREVERB_REVERBTIME_MIN, DSFX_WAVESREVERB_REVERBTIME_MAX );
  840.             LoadSingleParameter( hwndDlg, IDC_PARAM_NAME4, TEXT( "HighFreq RT Ratio (x:1)" ), g_lpFXManager->m_paramsReverb.fHighFreqRTRatio, DSFX_WAVESREVERB_HIGHFREQRTRATIO_MIN, DSFX_WAVESREVERB_HIGHFREQRTRATIO_MAX, 0.01f, 2 );
  841.             break;
  842.         }
  843.     }
  844. }
  845.  
  846.  
  847.  
  848.  
  849. //-----------------------------------------------------------------------------
  850. // Name: OnEffectChanged()  
  851. // Desc: Called when the UI prompted an effect change
  852. //-----------------------------------------------------------------------------
  853. VOID OnEffectChanged( HWND hwndDlg )
  854. {
  855.     switch( g_dwCurrentFXType )
  856.     {
  857.         case eSFX_chorus:
  858.         {
  859.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsChorus.fWetDryMix, DSFXCHORUS_WETDRYMIX_MIN, DSFXCHORUS_WETDRYMIX_MAX );
  860.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsChorus.fDepth, DSFXCHORUS_DEPTH_MIN, DSFXCHORUS_DEPTH_MAX );
  861.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsChorus.fFeedback, DSFXCHORUS_FEEDBACK_MIN, DSFXCHORUS_FEEDBACK_MAX );
  862.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME4, &g_lpFXManager->m_paramsChorus.fFrequency, DSFXCHORUS_FREQUENCY_MIN, DSFXCHORUS_FREQUENCY_MAX );
  863.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME5, &g_lpFXManager->m_paramsChorus.fDelay, DSFXCHORUS_DELAY_MIN, DSFXCHORUS_DELAY_MAX );
  864.  
  865.             if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_TRIANGLE ) == BST_CHECKED )
  866.                 g_lpFXManager->m_paramsChorus.lWaveform = DSFXCHORUS_WAVE_TRIANGLE;
  867.             else
  868.                 g_lpFXManager->m_paramsChorus.lWaveform = DSFXCHORUS_WAVE_SIN;
  869.  
  870.             if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_NEG_180 ) == BST_CHECKED )
  871.                 g_lpFXManager->m_paramsChorus.lPhase = DSFXCHORUS_PHASE_NEG_180;
  872.             else if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_NEG_90 ) == BST_CHECKED )
  873.                 g_lpFXManager->m_paramsChorus.lPhase = DSFXCHORUS_PHASE_NEG_90;
  874.             else if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_ZERO ) == BST_CHECKED )
  875.                 g_lpFXManager->m_paramsChorus.lPhase = DSFXCHORUS_PHASE_ZERO;
  876.             else if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_90 ) == BST_CHECKED )
  877.                 g_lpFXManager->m_paramsChorus.lPhase = DSFXCHORUS_PHASE_90;
  878.             else
  879.                 g_lpFXManager->m_paramsChorus.lPhase = DSFXCHORUS_PHASE_180;
  880.  
  881.             if( g_lpFXManager->m_lpChorus )
  882.                 g_lpFXManager->m_lpChorus->SetAllParameters( &g_lpFXManager->m_paramsChorus );
  883.  
  884.             break;
  885.         }
  886.  
  887.         case eSFX_compressor:
  888.         {
  889.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsCompressor.fGain, DSFXCOMPRESSOR_GAIN_MIN, DSFXCOMPRESSOR_GAIN_MAX );
  890.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsCompressor.fAttack, DSFXCOMPRESSOR_ATTACK_MIN, DSFXCOMPRESSOR_ATTACK_MAX );
  891.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsCompressor.fRelease, DSFXCOMPRESSOR_RELEASE_MIN, DSFXCOMPRESSOR_RELEASE_MAX );
  892.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME4, &g_lpFXManager->m_paramsCompressor.fThreshold, DSFXCOMPRESSOR_THRESHOLD_MIN, DSFXCOMPRESSOR_THRESHOLD_MAX );
  893.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME5, &g_lpFXManager->m_paramsCompressor.fRatio, DSFXCOMPRESSOR_RATIO_MIN, DSFXCOMPRESSOR_RATIO_MAX );
  894.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME6, &g_lpFXManager->m_paramsCompressor.fPredelay, DSFXCOMPRESSOR_PREDELAY_MIN, DSFXCOMPRESSOR_PREDELAY_MAX, 2 );
  895.  
  896.             if( g_lpFXManager->m_lpCompressor )
  897.                 g_lpFXManager->m_lpCompressor->SetAllParameters( &g_lpFXManager->m_paramsCompressor );
  898.             break;
  899.         }
  900.  
  901.         case eSFX_distortion:
  902.         {
  903.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsDistortion.fGain, DSFXDISTORTION_GAIN_MIN, DSFXDISTORTION_GAIN_MAX );
  904.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsDistortion.fEdge, DSFXDISTORTION_EDGE_MIN, DSFXDISTORTION_EDGE_MAX );
  905.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsDistortion.fPostEQCenterFrequency, DSFXDISTORTION_POSTEQCENTERFREQUENCY_MIN, DSFXDISTORTION_POSTEQCENTERFREQUENCY_MAX, 0 );
  906.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME4, &g_lpFXManager->m_paramsDistortion.fPostEQBandwidth, DSFXDISTORTION_POSTEQBANDWIDTH_MIN, DSFXDISTORTION_POSTEQBANDWIDTH_MAX, 0 );
  907.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME5, &g_lpFXManager->m_paramsDistortion.fPreLowpassCutoff, DSFXDISTORTION_PRELOWPASSCUTOFF_MIN, DSFXDISTORTION_PRELOWPASSCUTOFF_MAX, 0 );
  908.  
  909.             if( g_lpFXManager->m_lpDistortion )
  910.                 g_lpFXManager->m_lpDistortion->SetAllParameters( &g_lpFXManager->m_paramsDistortion );
  911.             break;
  912.         }
  913.  
  914.         case eSFX_echo:
  915.         {
  916.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsEcho.fWetDryMix, DSFXECHO_WETDRYMIX_MIN, DSFXECHO_WETDRYMIX_MAX );
  917.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsEcho.fFeedback, DSFXECHO_FEEDBACK_MIN, DSFXECHO_FEEDBACK_MAX );
  918.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsEcho.fLeftDelay, DSFXECHO_LEFTDELAY_MIN, DSFXECHO_LEFTDELAY_MAX );
  919.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME4, &g_lpFXManager->m_paramsEcho.fRightDelay, DSFXECHO_RIGHTDELAY_MIN, DSFXECHO_RIGHTDELAY_MAX );
  920.  
  921.             if( g_lpFXManager->m_lpEcho )
  922.                 g_lpFXManager->m_lpEcho->SetAllParameters( &g_lpFXManager->m_paramsEcho );
  923.             break;
  924.         }
  925.  
  926.         case eSFX_flanger:
  927.         {
  928.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsFlanger.fWetDryMix, DSFXFLANGER_WETDRYMIX_MIN, DSFXFLANGER_WETDRYMIX_MAX );
  929.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsFlanger.fDepth, DSFXFLANGER_DEPTH_MIN, DSFXFLANGER_DEPTH_MAX );
  930.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsFlanger.fFeedback, DSFXFLANGER_FEEDBACK_MIN, DSFXFLANGER_FEEDBACK_MAX );
  931.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME4, &g_lpFXManager->m_paramsFlanger.fFrequency, DSFXFLANGER_FREQUENCY_MIN, DSFXFLANGER_FREQUENCY_MAX, 2 );
  932.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME5, &g_lpFXManager->m_paramsFlanger.fDelay, DSFXFLANGER_DELAY_MIN, DSFXFLANGER_DELAY_MAX, 2 );
  933.  
  934.             if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_TRIANGLE ) == BST_CHECKED )
  935.                 g_lpFXManager->m_paramsFlanger.lWaveform = DSFXFLANGER_WAVE_TRIANGLE;
  936.             else
  937.                 g_lpFXManager->m_paramsFlanger.lWaveform = DSFXFLANGER_WAVE_SIN;
  938.  
  939.             if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_NEG_180 ) == BST_CHECKED )
  940.                 g_lpFXManager->m_paramsFlanger.lPhase = DSFXFLANGER_PHASE_NEG_180;
  941.             else if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_NEG_90 ) == BST_CHECKED )
  942.                 g_lpFXManager->m_paramsFlanger.lPhase = DSFXFLANGER_PHASE_NEG_90;
  943.             else if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_ZERO ) == BST_CHECKED )
  944.                 g_lpFXManager->m_paramsFlanger.lPhase = DSFXFLANGER_PHASE_ZERO;
  945.             else if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_90 ) == BST_CHECKED )
  946.                 g_lpFXManager->m_paramsFlanger.lPhase = DSFXFLANGER_PHASE_90;
  947.             else
  948.                 g_lpFXManager->m_paramsFlanger.lPhase = DSFXFLANGER_PHASE_180;
  949.  
  950.             if( g_lpFXManager->m_lpFlanger )
  951.                 g_lpFXManager->m_lpFlanger->SetAllParameters( &g_lpFXManager->m_paramsFlanger );
  952.             break;
  953.         }
  954.  
  955.         case eSFX_gargle:
  956.         {
  957.             FLOAT fRateHz;
  958.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &fRateHz, DSFXGARGLE_RATEHZ_MIN, DSFXGARGLE_RATEHZ_MAX );
  959.             g_lpFXManager->m_paramsGargle.dwRateHz = (DWORD) fRateHz;
  960.  
  961.             if( IsDlgButtonChecked( hwndDlg, IDC_RADIO_TRIANGLE ) == BST_CHECKED )
  962.                 g_lpFXManager->m_paramsGargle.dwWaveShape = DSFXGARGLE_WAVE_TRIANGLE;
  963.             else
  964.                 g_lpFXManager->m_paramsGargle.dwWaveShape = DSFXGARGLE_WAVE_SQUARE;
  965.  
  966.             if( g_lpFXManager->m_lpGargle )
  967.                 g_lpFXManager->m_lpGargle->SetAllParameters( &g_lpFXManager->m_paramsGargle );
  968.             break;
  969.         }
  970.  
  971.         case eSFX_parameq:
  972.         {
  973.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsParamEq.fCenter, DSFXPARAMEQ_CENTER_MIN, DSFXPARAMEQ_CENTER_MAX );
  974.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsParamEq.fBandwidth, DSFXPARAMEQ_BANDWIDTH_MIN, DSFXPARAMEQ_BANDWIDTH_MAX );
  975.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsParamEq.fGain, DSFXPARAMEQ_GAIN_MIN, DSFXPARAMEQ_GAIN_MAX );
  976.  
  977.             if( g_lpFXManager->m_lpParamEq )
  978.                 g_lpFXManager->m_lpParamEq->SetAllParameters( &g_lpFXManager->m_paramsParamEq );
  979.             break;
  980.         }
  981.  
  982.         case eSFX_reverb:
  983.         {
  984.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME1, &g_lpFXManager->m_paramsReverb.fInGain, DSFX_WAVESREVERB_INGAIN_MIN, DSFX_WAVESREVERB_INGAIN_MAX );
  985.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME2, &g_lpFXManager->m_paramsReverb.fReverbMix, DSFX_WAVESREVERB_REVERBMIX_MIN, DSFX_WAVESREVERB_REVERBMIX_MAX );
  986.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME3, &g_lpFXManager->m_paramsReverb.fReverbTime, DSFX_WAVESREVERB_REVERBTIME_MIN, DSFX_WAVESREVERB_REVERBTIME_MAX );
  987.             SaveSingleParameter( hwndDlg, IDC_PARAM_NAME4, &g_lpFXManager->m_paramsReverb.fHighFreqRTRatio, DSFX_WAVESREVERB_HIGHFREQRTRATIO_MIN, DSFX_WAVESREVERB_HIGHFREQRTRATIO_MAX, 2 );
  988.  
  989.             if( g_lpFXManager->m_lpReverb )
  990.                 g_lpFXManager->m_lpReverb->SetAllParameters( &g_lpFXManager->m_paramsReverb );
  991.             break;
  992.         }
  993.     }
  994. }
  995.  
  996.  
  997.  
  998.  
  999. //-----------------------------------------------------------------------------
  1000. // Name: ValidateFile()
  1001. // Desc: Checks to see if the file exists
  1002. //-----------------------------------------------------------------------------
  1003. HRESULT ValidateFile( HWND hDlg, TCHAR* strFileName )
  1004. {
  1005.     if( -1 == GetFileAttributes(strFileName) )
  1006.         return E_FAIL;
  1007.         
  1008.     SetDlgItemText( hDlg, IDC_TEXT_FILENAME, strFileName );
  1009.     SetDlgItemText( hDlg, IDC_TEXT_STATUS, TEXT("File loaded.") );
  1010.     strcpy( g_strFileName, strFileName );
  1011.     
  1012.     return S_OK;        
  1013. }
  1014.  
  1015.  
  1016.  
  1017.  
  1018. //-----------------------------------------------------------------------------
  1019. // Name: CSoundFXManager()
  1020. // Desc: constructor
  1021. //-----------------------------------------------------------------------------
  1022. CSoundFXManager::CSoundFXManager()
  1023. {
  1024.     m_lpChorus = NULL;
  1025.     m_lpCompressor = NULL;
  1026.     m_lpDistortion = NULL;
  1027.     m_lpEcho = NULL;
  1028.     m_lpFlanger = NULL;
  1029.     m_lpGargle = NULL;
  1030.     m_lpParamEq = NULL;
  1031.     m_lpReverb = NULL;
  1032.  
  1033.     ZeroMemory( &m_paramsChorus, sizeof( DSFXChorus ) );
  1034.     ZeroMemory( &m_paramsCompressor, sizeof( DSFXCompressor ) );
  1035.     ZeroMemory( &m_paramsDistortion, sizeof( DSFXDistortion ) );
  1036.     ZeroMemory( &m_paramsFlanger, sizeof( DSFXFlanger ) );
  1037.     ZeroMemory( &m_paramsEcho, sizeof( DSFXEcho ) );
  1038.     ZeroMemory( &m_paramsGargle, sizeof( DSFXGargle ) );
  1039.     ZeroMemory( &m_paramsParamEq, sizeof( DSFXParamEq ) );
  1040.     ZeroMemory( &m_paramsReverb, sizeof( DSFXWavesReverb ) );
  1041.  
  1042.     m_dwNumFX = 0;
  1043.     ZeroMemory( m_rgFxDesc, sizeof( DSEFFECTDESC ) * eNUM_SFX );
  1044.     ZeroMemory( m_rgRefGuids, sizeof( GUID * ) * eNUM_SFX );
  1045.     ZeroMemory( m_rgPtrs, sizeof(LPVOID*) * eNUM_SFX );
  1046.     ZeroMemory( m_rgLoaded, sizeof( BOOL ) * eNUM_SFX );
  1047.  
  1048.     m_lpDSB8 = NULL;
  1049.     m_pAudioPath = NULL;
  1050. }
  1051.  
  1052.  
  1053.  
  1054.  
  1055. //-----------------------------------------------------------------------------
  1056. // Name: ~CSoundFXManager()
  1057. // Desc: destructor
  1058. //-----------------------------------------------------------------------------
  1059. CSoundFXManager::~CSoundFXManager()
  1060. {
  1061.     // free any effects
  1062.     DisableAllFX();
  1063.     SAFE_RELEASE( m_lpDSB8 );
  1064.     SAFE_RELEASE( m_pAudioPath );
  1065. }
  1066.  
  1067.  
  1068.  
  1069.  
  1070. //-----------------------------------------------------------------------------
  1071. // Name: Initialize()
  1072. // Desc: associates a DirectSoundBuffer with the manager, any effects
  1073. //       enabled in the old DirectSoundBuffer will be disabled, 
  1074. //       and the effect objects released
  1075. //-----------------------------------------------------------------------------
  1076. HRESULT CSoundFXManager::Initialize( IDirectMusicAudioPath8* pAudioPath, 
  1077.                                      BOOL bLoadDefaultParamValues )
  1078. {
  1079.     HRESULT hr;
  1080.  
  1081.     if( m_lpDSB8 )
  1082.     {
  1083.         // release the effect for the previously associated sound buffers
  1084.         DisableAllFX();
  1085.         SAFE_RELEASE( m_lpDSB8 );
  1086.         SAFE_RELEASE( m_pAudioPath );
  1087.     }
  1088.  
  1089.     if( NULL == pAudioPath )
  1090.         return S_OK;
  1091.     
  1092.     if( FAILED( hr = pAudioPath->GetObjectInPath( DMUS_PCHANNEL_ALL,
  1093.                 DMUS_PATH_BUFFER, 0, GUID_NULL, 0, IID_IDirectSoundBuffer8, 
  1094.                 (LPVOID*) &m_lpDSB8 )))
  1095.         return hr;
  1096.  
  1097.     m_pAudioPath = pAudioPath;
  1098.  
  1099.     if( bLoadDefaultParamValues )
  1100.         LoadDefaultParamValues();
  1101.  
  1102.     return S_OK;
  1103. }
  1104.  
  1105.  
  1106.  
  1107.  
  1108. //-----------------------------------------------------------------------------
  1109. // Name: UnInitialize()
  1110. // Desc: the manager goes back to default state, the effects params, however
  1111. //       will not be reset
  1112. //-----------------------------------------------------------------------------
  1113. HRESULT CSoundFXManager::UnInitialize()
  1114. {
  1115.     Initialize( NULL, FALSE );
  1116.  
  1117.     return S_OK;
  1118. }
  1119.  
  1120.  
  1121.  
  1122.  
  1123. //-----------------------------------------------------------------------------
  1124. // Name: LoadDefaultParamValues()
  1125. // Desc: loads the default param value for each effect
  1126. //-----------------------------------------------------------------------------
  1127. HRESULT CSoundFXManager::LoadDefaultParamValues()
  1128. {
  1129.     DWORD i;
  1130.  
  1131.     if( NULL == m_lpDSB8 )
  1132.         return E_FAIL;
  1133.  
  1134.     for( i = eSFX_chorus; i < eNUM_SFX; i++ )
  1135.         SetFXEnable( i );
  1136.     
  1137.     ActivateFX();
  1138.  
  1139.     if( m_lpChorus )
  1140.         m_lpChorus->GetAllParameters( &m_paramsChorus );
  1141.  
  1142.     if( m_lpCompressor )
  1143.         m_lpCompressor->GetAllParameters( &m_paramsCompressor );
  1144.     
  1145.     if( m_lpDistortion )
  1146.         m_lpDistortion->GetAllParameters( &m_paramsDistortion );
  1147.  
  1148.     if( m_lpEcho )
  1149.         m_lpEcho->GetAllParameters( &m_paramsEcho );
  1150.  
  1151.     if( m_lpFlanger )
  1152.         m_lpFlanger->GetAllParameters( &m_paramsFlanger );
  1153.  
  1154.     if( m_lpGargle )
  1155.         m_lpGargle->GetAllParameters( &m_paramsGargle );
  1156.  
  1157.     if( m_lpParamEq )
  1158.         m_lpParamEq->GetAllParameters( &m_paramsParamEq );
  1159.  
  1160.     if( m_lpReverb )
  1161.         m_lpReverb->GetAllParameters( &m_paramsReverb );
  1162.  
  1163.     DisableAllFX();
  1164.  
  1165.     return S_OK;
  1166. }
  1167.  
  1168.  
  1169.  
  1170.  
  1171. //-----------------------------------------------------------------------------
  1172. // Name: LoadCurrentFXParameters
  1173. // Desc: loads the default param value for each effect
  1174. //-----------------------------------------------------------------------------
  1175. HRESULT CSoundFXManager::LoadCurrentFXParameters()
  1176. {
  1177.     if( m_lpChorus )
  1178.         m_lpChorus->SetAllParameters( &m_paramsChorus );
  1179.  
  1180.     if( m_lpCompressor )
  1181.         m_lpCompressor->SetAllParameters( &m_paramsCompressor );
  1182.     
  1183.     if( m_lpDistortion )
  1184.         m_lpDistortion->SetAllParameters( &m_paramsDistortion );
  1185.  
  1186.     if( m_lpEcho )
  1187.         m_lpEcho->SetAllParameters( &m_paramsEcho );
  1188.  
  1189.     if( m_lpFlanger )
  1190.         m_lpFlanger->SetAllParameters( &m_paramsFlanger );
  1191.  
  1192.     if( m_lpGargle )
  1193.         m_lpGargle->SetAllParameters( &m_paramsGargle );
  1194.  
  1195.     if( m_lpParamEq )
  1196.         m_lpParamEq->SetAllParameters( &m_paramsParamEq );
  1197.  
  1198.     if( m_lpReverb )
  1199.         m_lpReverb->SetAllParameters( &m_paramsReverb );
  1200.  
  1201.     return S_OK;
  1202. }
  1203.  
  1204.  
  1205.  
  1206.  
  1207. //-----------------------------------------------------------------------------
  1208. // Name: SetFXEnable()
  1209. // Desc: enables a sound effect for the sound buffer associated with this
  1210. //-----------------------------------------------------------------------------
  1211. HRESULT CSoundFXManager::SetFXEnable( DWORD esfxType )
  1212. {
  1213.     HRESULT hr;
  1214.  
  1215.     if( esfxType >= eNUM_SFX )
  1216.         return E_FAIL;
  1217.  
  1218.     if( m_rgLoaded[esfxType] )
  1219.         return S_FALSE;
  1220.     else
  1221.         m_rgLoaded[esfxType] = TRUE;
  1222.  
  1223.     switch ( esfxType )
  1224.     {
  1225.     case eSFX_chorus:
  1226.         hr = EnableGenericFX( GUID_DSFX_STANDARD_CHORUS,     IID_IDirectSoundFXChorus8,      
  1227.                               (LPVOID*) &m_lpChorus );
  1228.         break;
  1229.     case eSFX_compressor:
  1230.         hr = EnableGenericFX( GUID_DSFX_STANDARD_COMPRESSOR, IID_IDirectSoundFXCompressor8,  
  1231.                               (LPVOID*) &m_lpCompressor );
  1232.         break;
  1233.     case eSFX_distortion:
  1234.         hr = EnableGenericFX( GUID_DSFX_STANDARD_DISTORTION, IID_IDirectSoundFXDistortion8,  
  1235.                               (LPVOID*) &m_lpDistortion );
  1236.         break;
  1237.     case eSFX_echo:
  1238.         hr = EnableGenericFX( GUID_DSFX_STANDARD_ECHO,       IID_IDirectSoundFXEcho8,        
  1239.                               (LPVOID*) &m_lpEcho );
  1240.         break;
  1241.     case eSFX_flanger:
  1242.         hr = EnableGenericFX( GUID_DSFX_STANDARD_FLANGER,    IID_IDirectSoundFXFlanger8,     
  1243.                               (LPVOID*) &m_lpFlanger );
  1244.         break;
  1245.     case eSFX_gargle:
  1246.         hr = EnableGenericFX( GUID_DSFX_STANDARD_GARGLE,     IID_IDirectSoundFXGargle8,      
  1247.                               (LPVOID*) &m_lpGargle );
  1248.         break;
  1249.     case eSFX_parameq:
  1250.         hr = EnableGenericFX( GUID_DSFX_STANDARD_PARAMEQ,    IID_IDirectSoundFXParamEq8,     
  1251.                               (LPVOID*) &m_lpParamEq );
  1252.         break;
  1253.     case eSFX_reverb:
  1254.         hr = EnableGenericFX( GUID_DSFX_WAVES_REVERB,        IID_IDirectSoundFXWavesReverb8, 
  1255.                               (LPVOID*) &m_lpReverb );
  1256.         break;
  1257.     default:
  1258.         hr = E_FAIL;
  1259.         break;
  1260.     }
  1261.  
  1262.     return hr;
  1263. }
  1264.  
  1265.  
  1266.  
  1267.  
  1268. //-----------------------------------------------------------------------------
  1269. // Name: DisableAllFX()
  1270. // Desc: disables all effect in the DirectSoundBuffer, and releases all effect
  1271. //       object.
  1272. //-----------------------------------------------------------------------------
  1273. HRESULT CSoundFXManager::DisableAllFX()
  1274. {
  1275.     HRESULT hr;
  1276.  
  1277.     // release all effect interfaces created with this manager so far
  1278.     SAFE_RELEASE( m_lpChorus );
  1279.     SAFE_RELEASE( m_lpCompressor );
  1280.     SAFE_RELEASE( m_lpDistortion );
  1281.     SAFE_RELEASE( m_lpEcho );
  1282.     SAFE_RELEASE( m_lpFlanger );
  1283.     SAFE_RELEASE( m_lpGargle );
  1284.     SAFE_RELEASE( m_lpParamEq );
  1285.     SAFE_RELEASE( m_lpReverb );
  1286.     
  1287.     m_dwNumFX = 0;
  1288.     ZeroMemory( m_rgFxDesc, sizeof( DSEFFECTDESC ) * eNUM_SFX );
  1289.     ZeroMemory( m_rgRefGuids, sizeof( GUID * ) * eNUM_SFX );
  1290.     ZeroMemory( m_rgPtrs, sizeof(LPVOID*) * eNUM_SFX );
  1291.     ZeroMemory( m_rgLoaded, sizeof( BOOL ) * eNUM_SFX );
  1292.  
  1293.     if( NULL == m_lpDSB8 )
  1294.         return E_FAIL;
  1295.  
  1296.     if( m_pAudioPath )
  1297.         m_pAudioPath->Activate( FALSE );
  1298.     
  1299.     // this removes all fx from the buffer
  1300.     if( FAILED( hr = m_lpDSB8->SetFX( 0, NULL, NULL ) ) )
  1301.         return DXTRACE_ERR( TEXT("SetFX"), hr );
  1302.  
  1303.     if( m_pAudioPath )
  1304.         m_pAudioPath->Activate( TRUE );
  1305.     
  1306.     return S_OK;
  1307. }
  1308.  
  1309.  
  1310.  
  1311.  
  1312. //-----------------------------------------------------------------------------
  1313. // Name: ActivateFX()
  1314. // Desc: activate the effects enabled from EnableFX()
  1315. //-----------------------------------------------------------------------------
  1316. HRESULT CSoundFXManager::ActivateFX()
  1317. {
  1318.     DWORD dwResults[eNUM_SFX];
  1319.     HRESULT hr;
  1320.     DWORD i;
  1321.  
  1322.     if( NULL == m_lpDSB8 )
  1323.         return E_FAIL;
  1324.  
  1325.     if( m_dwNumFX == 0 )
  1326.         return S_FALSE;
  1327.  
  1328.     if( m_pAudioPath )
  1329.         m_pAudioPath->Activate( FALSE );
  1330.  
  1331.     if( FAILED( hr = m_lpDSB8->SetFX( m_dwNumFX, m_rgFxDesc, dwResults ) ) )
  1332.         return DXTRACE_ERR( TEXT("SetFX"), hr );
  1333.  
  1334.     // get reference to the effect object
  1335.     for( i = 0; i < m_dwNumFX; i++ )
  1336.         if( FAILED( hr = m_lpDSB8->GetObjectInPath( m_rgFxDesc[i].guidDSFXClass, 0, *m_rgRefGuids[i], m_rgPtrs[i] ) ) )
  1337.             return hr;
  1338.  
  1339.     if( m_pAudioPath )
  1340.         m_pAudioPath->Activate( TRUE );
  1341.  
  1342.     return S_OK;
  1343. }
  1344.  
  1345.  
  1346.  
  1347.  
  1348. //-----------------------------------------------------------------------------
  1349. // Name: EnableGenericFX()
  1350. // Desc: given information, tries to enabled an effect in a DirectSoundBuffer8,
  1351. //       and tries obtain reference to effect interface
  1352. //-----------------------------------------------------------------------------
  1353. HRESULT CSoundFXManager::EnableGenericFX( GUID guidSFXClass, REFGUID rguidInterface, LPVOID * ppObj )
  1354. {
  1355.     // if an effect already allocated
  1356.     if( *ppObj )
  1357.         return S_FALSE;
  1358.  
  1359.     if( m_dwNumFX >= eNUM_SFX )
  1360.         return E_FAIL;
  1361.  
  1362.     // set the effect to be enabled
  1363.     ZeroMemory( &m_rgFxDesc[m_dwNumFX], sizeof(DSEFFECTDESC) );
  1364.     m_rgFxDesc[m_dwNumFX].dwSize         = sizeof(DSEFFECTDESC);
  1365.     m_rgFxDesc[m_dwNumFX].dwFlags        = 0;
  1366.     CopyMemory( &m_rgFxDesc[m_dwNumFX].guidDSFXClass, &guidSFXClass, sizeof(GUID) );
  1367.  
  1368.     m_rgRefGuids[m_dwNumFX] = &rguidInterface;
  1369.     m_rgPtrs[m_dwNumFX] = ppObj;
  1370.  
  1371.     m_dwNumFX++;
  1372.  
  1373.     return S_OK;
  1374. }
  1375.  
  1376.  
  1377.  
  1378.  
  1379. //-----------------------------------------------------------------------------
  1380. // Name: ProcessDirectMusicMessages()
  1381. // Desc: 
  1382. //-----------------------------------------------------------------------------
  1383. HRESULT ProcessDirectMusicMessages( HWND hDlg )
  1384. {
  1385.     HRESULT hr;
  1386.     IDirectMusicPerformance8* pPerf = NULL;
  1387.     DMUS_NOTIFICATION_PMSG* pPMsg;
  1388.         
  1389.     if( NULL == g_lpMusicManager )
  1390.         return S_OK;
  1391.  
  1392.     pPerf = g_lpMusicManager->GetPerformance();
  1393.  
  1394.     // Get waiting notification message from the performance
  1395.     while( S_OK == pPerf->GetNotificationPMsg( &pPMsg ) )
  1396.     {
  1397.         switch( pPMsg->dwNotificationOption )
  1398.         {
  1399.         case DMUS_NOTIFICATION_SEGEND:
  1400.             if( pPMsg->punkUser )
  1401.             {
  1402.                 IDirectMusicSegmentState8* pSegmentState   = NULL;
  1403.                 IDirectMusicSegment*       pNotifySegment   = NULL;
  1404.                 IDirectMusicSegment8*      pNotifySegment8  = NULL;
  1405.                 IDirectMusicSegment8*      pPrimarySegment8 = NULL;
  1406.  
  1407.                 // The pPMsg->punkUser contains a IDirectMusicSegmentState8, 
  1408.                 // which we can query for the segment that the SegmentState refers to.
  1409.                 if( FAILED( hr = pPMsg->punkUser->QueryInterface( IID_IDirectMusicSegmentState8,
  1410.                                                                   (VOID**) &pSegmentState ) ) )
  1411.                     return DXTRACE_ERR( TEXT("QueryInterface"), hr );
  1412.  
  1413.                 if( FAILED( hr = pSegmentState->GetSegment( &pNotifySegment ) ) )
  1414.                 {
  1415.                     // Sometimes the segend arrives after the segment is gone
  1416.                     // This can happen when you load another segment as 
  1417.                     // a motif or the segment is ending
  1418.                     if( hr == DMUS_E_NOT_FOUND )
  1419.                     {
  1420.                         SAFE_RELEASE( pSegmentState );
  1421.                         return S_OK;
  1422.                     }
  1423.  
  1424.                     return DXTRACE_ERR( TEXT("GetSegment"), hr );
  1425.                 }
  1426.  
  1427.                 if( FAILED( hr = pNotifySegment->QueryInterface( IID_IDirectMusicSegment8,
  1428.                                                                  (VOID**) &pNotifySegment8 ) ) )
  1429.                     return DXTRACE_ERR( TEXT("QueryInterface"), hr );
  1430.  
  1431.                 // Get the IDirectMusicSegment for the primary segment
  1432.                 pPrimarySegment8 = g_pSegment->GetSegment();
  1433.  
  1434.                 // Figure out which segment this is
  1435.                 if( pNotifySegment8 == pPrimarySegment8 )
  1436.                 {
  1437.                     // Update the UI controls to show the sound as stopped
  1438.                     EnablePlayUI( hDlg, TRUE );
  1439.                 }
  1440.  
  1441.                 // Cleanup
  1442.                 SAFE_RELEASE( pSegmentState );
  1443.                 SAFE_RELEASE( pNotifySegment );
  1444.                 SAFE_RELEASE( pNotifySegment8 );
  1445.             }
  1446.             break;
  1447.         }
  1448.  
  1449.         pPerf->FreePMsg( (DMUS_PMSG*)pPMsg ); 
  1450.     }
  1451.  
  1452.     return S_OK;
  1453. }
  1454.